# 6种类型可以被迭代 list,dict,tuple,set,open()，str

"""
可迭代类型:str,list,tuple,dict,set,open() 文件类操作
iterable:可迭代的东西
iterator:迭代器

从迭代器中拿数据的两种方案:
1,iter()内置函数拿到迭代器,从对象中取出迭代器对象--主流方法
2, s.__next__() 特殊方法--用的很少

# 统一了不同数据类型的遍历操作
# 已经取出来的迭代器,在for循环中又取了一次迭代器,也可以正常输出,所以迭代器本身是可以被迭代的
# 迭代器只能向下去拿,不能反复
# 节省内存
# 惰性机制,什么时候调用 next() 或者 .__next__() 才输出下一个


"""

str1 = "zkk".__iter__()

# for i in str1:
#     print(i)

# 先用iter转换成迭代器，再去用next（）去迭代对象///或者用
# iterStr = iter(str1)
# print(type(iterStr))
# print(next(iterStr))
# print(next(iterStr))
# print(next(iterStr))

# 迭代次数超出迭代内容时会报错：StopIteration 前边的next迭代已经停止了,不可以在从迭代器中拿数据
# print(next(iterStr))

# 也可以用   对象.__iter__() 去转换迭代器
# iterStr2 = str1.__iter__()
# print(type(str1))
# print(next(str1))
# print(next(str1))
# print(next(str1))



#try 语法
s = [34, 23, 121, 45, 32, "芸菲"]
ss = iter(s)
while 1:
    try:
        # 遍历取ss中的字符
        x = ss.__next__()
        print(x)
    # 遇到 报错StopIteration 就跳出循环
    except StopIteration:
        break
print("完成可迭代对象的迭代操作xx.__next__()")


# 已经取出来的迭代器,在for循环中又取了一次迭代器,也可以正常输出,所以迭代器本身是可以被迭代的
sss = "你好,欢迎来到魔兽世界!"
it = sss.__iter__()  # 取出sss的迭代器
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
# for mm in it:
#     print(mm)